//配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'

import routes from './routes.js'
//引入仓库
import store from '@/store/index.js'

//先把 VueRouter 原型对象的 push，先保存一份
let originPush = VueRouter.prototype.push

//挂载路由插件
Vue.use(VueRouter)

// 重写 push|replace
// 第一个参数：告诉原来 push 方法，你往哪里跳转（传递哪些参数）
// 第二个参数：成功回调
// 第三个参数：失败回调
// call || apply 区别
// 相同点；都可以调用函数一次，都可以篡改函数上下文一次
// 不同点：call 与 apply 传递参数，call 传递参数用逗号隔开，apply 方法执行，传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject)
  }
  else {
    originPush.call(this, location, () => { }, () => { })
  }
}


//配置路由
const router = new VueRouter({
  routes,
  //当跳转到商品详情页时候，滚动条在最顶端
  scrollBehavior (to, from, savedPosition) {
    // 始终滚动到顶部
    return { y: 0 }
  }
})

//全局守卫： 前置守卫（再路由跳转之前进行判断）
router.beforeEach(async (to, from, next) => {
  //to: 可以获取到你要跳转到哪个路由信息
  //from：可以获取到在跳转之前的那个路由信息
  //next：放行函数   next()：放行   next(path)放行到指定路由

  //用户登录了，会有token，没有登录一定不会有token
  let token = store.state.user.token
  //用户信息
  let name = store.state.user.userInfo.name
  //用户已经登录了
  if (token) {
    //用户登录还想跳转到login【想屁呢！回首页去吧】
    if (to.path == '/login' || to.path == '/register') {
      next('/home')
    }
    else {
      //登陆了，去的不是login【home|search|detail|shopcart】
      //如果用户名已有
      if (name) {
        next()
      }
      else {
        //没有用户信息，派发action让仓库存储用户信息再跳转
        try {
          //获取用户信息成功
          await store.dispatch('getUserInfo')
          //放行
          next()
        }
        catch (error) {
          //token失效了获取不到用户信息，重新登录
          await store.dispatch('userLogout')
          next('/login')
        }
      }
    }
  }
  else {
    //未登录:不能去交易相关、不能去支付相关【pay|paysuccess】、不能去个人中心
    let toPath = to.path
    if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
      //把未登录的时候想去没去成的信息，存储于地址栏中
      next('/login?redirect=' + toPath)
    }
    else {
      //去的不是上面这些路由（home|search|shopCart）---放行
      next()
    }
  }
})

export default router

